perm filename TLKELF.FAI[AL,HE] blob
sn#209223 filedate 1977-02-21 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE TLKELF
C00006 00003 START OF EXECUTABLE CODE
C00009 00004 [CONTINUATION OF "TLKELF"]
C00013 00005 [LOCAL STORAGE AREA]
C00016 ENDMK
C⊗;
TITLE TLKELF
INTERNAL TLKELF
;"TLKELF" IS A SAIL CALLABLE PROCEDURE FOR SENDING A COMMAND INSTRUCTION
;BLOCK FROM THE PDP10 TO THE PDP11. THE INSTRUCTION BLOCK CONTAINS THE
;INFORMATION NECESSARY TO DRIVE ONE ARM JOINT. IN ADDITION, IF DYNAMIC
;RESPONSE DATA IS TO BE SEND FROM THE ELF TO THE TEN, "TLKELF" COLLECTS
;THE DATA BEFORE EXITING. A SAMPLE SAIL CALL FOLLOWS:
;
; RUN←TLKELF(ARM,JOINT,DCOFF,AMP,CYCLE,DURA,TP,MASTER,GRF,DATA);
;WHERE
; RUN = 0 INDICATES MOVEMENT INITIATED, 1 INDICATES FAILURE
; ARM = 0 FOR YELLOW ARM, 1 FOR BLUE
; JOINT = 1 TO 6
; DCOFF = -128 TO 128, DC STEP OFFSET
; AMP = -128 TO 128, MAXIMUM SINUSOIDAL MOTOR DRIVE
; CYCLE = 1 TO 32000, PERIOD OF SINUSOID
; DURA = 1 TO 32000, DURATION OF MOTOR DRIVE
; TP = 0 INDICATES POT TO BE READ, 1 FOR TACHOMETER
; MASTER= CHECK WORD TO ELF TO INSURE THIS IS A LEGAL INSTRUCTION
; GRF = 1 INDICATES DYNAMIC RESPONSE DATA TO BE SEND BACK FOR GRAPHING
; 0 INDICATES NO GRAPHICS
; DATA = ARRAY TO RETURN DYNAMIC RESPONSE DATA
;
;TLKELF EXPECTS THE "ARM" VALUE IN THE ELF TO BE NEGATIVE INDICATING THAT THE
;ELF IS PREPARED TO RECEIVE A COMMAND BLOCK. IF "ARM" IS NOT NEGATIVE AN ERROR
;MESSAGE IS TYPED AND TLKELF EXITS TO THE CALLING PROGRAM. AFTER PASSING THE
;CONTROL BLOCK, TLKELF GOES INTO A WAIT LOOP LOOKING FOR "ARM" TO GO NEGATIVE
;IN THE ELF INDICATING THAT THE ARM MOTION IS COMPLETED. IF TLKELF IS IN A WAIT
;LOOP FOR OVER 60 SECONDS, AN ERROR MESSAGE IS TYPED. IF THE "ELF" COMPLETES
;A MOTION SUCCESSFULLY, TLKELF CHECKS THE VALUE OF GRF TO DETERMINE IF DYNAMIC
;RESPONSE DATA IS TO BE COLLECTED. IF GRF IS TRUE, THE ARRAY DATA IS FILLED
;WITH 3000 WORDS FROM THE ELF. AFTER EXECUTION OF TLKELF, THE ELF IS LEFT IN A
;WAIT LOOP LOOKING FOR ANOTHER COMMAND BLOCK.
;DEFINITIONS
P←17 ;PUSH STACK REGISTER
CMDADD←37500 ;COMMAND BUFFER (WORD) ADDRESS IN ELF
DRADD←37540 ;DYNAMIC RESPONSE BUFFER (WORD) ADDRESS IN ELF
;START OF EXECUTABLE CODE
TLKELF: SETZ 1, ;CLEAR ERROR FLAG
MOVEM 16,HOLD+16 ;SAVE THE REGISTERS
HRRZI 16,HOLD
BLT 16,HOLD+15
MOVE 1,P ;GET THE ADDRESS OF THE STACK
SUBI 1,=10 ;GET THE ADDRESS OF "ARM" NUMBER
HRLZ 1,1 ;PREPARE TO BLT INTO LOCAL ARRAY
HRRI 1,CMDARR ;STORE ARGUMENTS IN CMDARR
BLT 1,CMDARR+11 ;TRANSFER ARGUMENTS
SOS 2,DATA ;DECREMENT ARRAY POINTER
HRLI 2,-=3000 ;SET POINTER TO TRANSFER 3000 WORDS INTO DATA
MOVEM 2,INLST
IOPUSH 1, ;CALLER MIGHT WANT THIS CHANNEL
JRST [ OUTSTR CM0 ;IOPDLOV MESSAGE
JRST ERR ]
INIT 1,17 ;INITIALIZE THE ELF
SIXBIT /ELF/
0
JRST [ OUTSTR CM1 ;ERROR RETURN
ERR: AOS HOLD+1 ;RETURN ERROR VALUE
JRST TLKDNE ]
GETSTS 1,1 ;GET THE ELF STATUS WORD
TRNE 1,777700 ;CHECK FOR ERROR CONDITION
JRST [ OUTSTR CM2 ;INDICATE STATUS ERROR
JRST ERR ]
;CHECK IF ELF IS READY TO RECEIVE A COMMAND BLOCK
MTAPE 1,ARMADD ;GET THE VALUE OF "ARM" WORD IN ELF
JRST [ OUTSTR CM3 ;ERROR RETURN
JRST ERR ]
MOVE 2,ARM ;LOAD VALUE INTO REGISTER
JUMPGE 2,[ OUTSTR CM4 ;ELF NOT READY FOR COMMAND IF ARM GE 0
JRST ERR ]
;SEND COMMAND BLOCK TO "ELF"
USETO 1,CMDMDE ;SET UP OUTPUT OF COMMAND BLOCK
OUT 1,OUTLST ;SEND THE COMMAND LIST TO THE ELF
JRST .+2 ;NORMAL RETURN
JRST [ OUTSTR CM5 ;ERROR RETURN
JRST ERR ]
;GO INTO WAIT LOOP UNTIL TASK DONE
MOVEI =30 ;SET WAIT LOOP COUNT
MOVEM CNT
SLEP: MOVEI 2,1 ;SET PROGRAM TO SLEEP FOR 1 SECOND
SLEEP 2,
; [CONTINUATION OF "TLKELF"]
MTAPE 1,ARMADD ;GET THE VALUE OF "ARM" WORD IN ELF
JRST [ OUTSTR COM6 ;ERROR RETURN
JRST ERR ]
MOVN 1,ARM ;LOAD VALUE INTO REGISTER
JUMPG 1,DVEDNE ;IF "ARM" VALUE NEGATIVE, BRANCH, MOTOR DRIVE DONE
SOSE CNT ;SKIP IF ELF TAKES TOO MUCH TIME
JRST SLEP ;ELSE GO SLEEP AGAIN
OUTSTR COM7 ;TELL OPERATOR, ELF TOOK TOO MUCH TIME
JRST ERR
;MOTOR DRIVE FUNCTION COMPLETED. EXIT OR COLLECT RESPONSE DATA
DVEDNE: CAIN 1,2 ;CHECK IF ERROR CODE TWO RETURNED
JRST [ OUTSTR COM9 ;TYPE MASTER NUMBER ERROR
JRST ERR ]
CAIN 1,3 ;CHECK IF PANIC BUTTON HIT
JRST [ OUTSTR COM10 ;TYPE ERROR MESSAGE
JRST ERR ]
CAIN 1,4 ;CHECK IF JOINT STARTING OUT OF RANGE
JRST [ OUTSTR COM11 ;TYPE ERROR MESSAGE
JRST ERR ]
SKIPG GRF ;SKIP IF DYNAMIC RESPONSE DATA REQUESTED
JRST TLKDNE ;ELSE GO TO EXIT SEQUENCE
OR 1,[400004,,400000] ;ADD TRANSFER MODE BITS
MOVEM 1,DYNA
USETI 1,DYNA ;SET UP INPUT OF D.R. DATA BLOCKS
IN 1,INLST ;READ IN A BLOCK OF DATA
JRST .+2 ;NORMAL RETURN
JRST [ OUTSTR COM8 ;ERROR RETURN
JRST ERR ]
;RETURN TO CALLING PROGRAM
TLKDNE: IOPOP 1, ;RELEASE THE ELF & RESTORE CHANNEL 1
JFCL ;JUST CANNOT HAPPEN
HRLZI 16,HOLD ;RESTORE THE REGISTERS
BLT 16,16
SUB P,[13(13)] ;POP ARGUMENTS OFF STACK
JRST @13(P) ;RETURN
;END OF "TLKELF"
; [LOCAL STORAGE AREA]
PT: 0
CNT: 0
HOLD: BLOCK 17
INBUF: BLOCK 3
;COMMAND DATA BLOCK
CMDARR: 0 ;YELLOW OR BLUE ARM
0 ;JOINT
0 ;DC OFFSET
0 ;SINUSOID AMPLITUDE
0 ;SINUSOID PERIOD
0 ;MOTION DURATION
0 ;POT/TACH FLAG
0 ;MASTER NUMBER
GRF: 0 ;GRAPHIC/DYNAMIC RESPONSE FLAG
DATA: 0 ;ADDRESS OF DYNAMIC RESPONSE DATA ARRAY
;I/O DATA AREAS
ARMADD: 002004,,CMDADD ;MODE AND ADDRESS FOR COMMAND OUTPUT STRING
ARM: 0 ;VALUE OF "ARM" LOCATION IN ELF
DYNA: 400004,,400000+DRADD ;MODE AND ADDRESS FOR "IN" OF DYNAMIC RESPONSE DATA
CMDMDE: 400004,,400000+CMDADD ;MODE AND ADDRESS FOR COMMAND OUTPUT STRING
OUTLST: IOWD =8,CMDARR ;OUT COMMAND LIST
0
INLST: IOWD =3000,INBUF ;DYNAMIC RESPONSE INPUT LIST
0
;OUTPUT STRINGS
CM0: ASCIZ/IOPDLOV WHEN TRY TO SAVE CHANNEL 1 FOR "ELF"
/
CM1: ASCIZ/CANNOT INIT "ELF"
/
CM2: ASCIZ/"ELF" STATUS WORD INDICATES ERROR CONDITION
/
CM3: ASCIZ/READING OF "ELF" READY FLAG FAILED
/
CM4: ASCIZ/"ELF" NOT READY FOR ARM COMMAND
/
CM5: ASCIZ/BAD TRANSFER OF COMMAND LIST TO "ELF"
/
COM6: ASCIZ/BAD READ FROM "ELF" DURING MOTOR DRIVE WAIT LOOP
/
COM7: ASCIZ/MOTOR DRIVE TOOK TOO LONG TO EXECUTE
/
COM8: ASCIZ/BAD READ FROM "ELF" DURING GRAPHICS DATA TRANSFER
/
COM9: ASCIZ/WRONG MASTER NUMBER SENT TO "ELF"
/
COM10: ASCIZ/NO POWER TO ARM INTERFACE, PLEASE RESET
/
COM11: ASCIZ/CAN'T MOVE, REQUESTED JOINT OUT OF RANGE
/
END